/* eslint-disable no-unused-vars */
/*
      ------分数注意事项-----
      本次测试满分为100(最多100分), 有4道加分题; 答案不够完整或者有错误当题0分处理;

      ------分数处理-----
      (0-60]: 不及格, 处理: 提供第二份不同试卷晚自习的时候重新考试, 并在第二天晚自习时间单独进行测试题提问(大部分都回答不上则采用手抄试卷方案);

      (60-75]: 良良, 处理: 晚自习时间单独进行测试题提问(大部分都回答不上则采用手抄试卷方案);

      (75-90]: 良好, 处理: 放你一马, 好好复习;

      (90-100]: 优秀, 处理: 好好好, 继续保持;
      */

// 1.JS延迟加载的方式有哪些？（5）
// (1)设置定时器  (2)使用async异步加载
// 2.前端 JavaScript 中的 ECMAScript、DOM、BOM 的含义；（5）
// ECMAScript是ECMA组织指定的一套标准；DOM是document object model，即文档对象模型；BOM是browser object model，即浏览器对象模型
// 4.如何进行数据类型的判断？（5）
// (1)使用typeof检测，不能对一些数据类型进行检测；(2)使用instanceof检测，并返回布尔值；(3)使用Object.prototype.toString.call()进行检测，返回对象原型的数据类型
// 5.null 和 undefined 的区别？什么时候会得到 undefined？（5）
// null是空的对象，空的引用地址；underfined是声明了变量但是没有赋值；函数默认返回underfined，访问对象不存在属性时，也会返回undefined
// 6.如何理解 null == undefined 返回 true，null === undefined 返回 false？（5）
// null和underfined转化为布尔值都是false，因为==只判断数值相等，所以null == undefined，返回true；但是null和underfined的数据类型不相等，所以null === underfined，返回false
// 7.使用 continue 或 break 终止循环时，两种方式的区别是？（5）
// continue是跳过当前符合条件的流程，进行下一个流程；break则是中断整个流程
// 8.如何判断字符串内是否包含指定字符？（5）
// (1)使用indexOf()方法进行判断，如果不返回-1，而是数字，则代表该字符存在，例子如下：
// let str = '123'  str.indexOf(1)  // 返回0  str.indexOf(4) //返回-1
// (2)使用includes()方法进行判断，如果返回true，则代表该字符存在，例子如下：
// et str = '123'  str.includes(1)  // 返回true  str.indexOf(4) //返回false
// 9.请尽量列举出数组的方法，并且注明哪些方法会修改原数组，哪些不会；（5）
// (1)concat(),对数组进行拼接，不会修改原数组；(2)join()，将数组转字符串，不会修改原数组；(3)reverse()，对数组里的数据进行翻转，会修改原数组；(4)slice()，截取范围内的数组，不会修改原数组；(5)splice()，对数据进行增加、删除和修改，会修改原数组；(6)push()，在数组末尾推进元素，会修改原数组
// 10. 请写出下面语句的输出结果：（5）
// let bar = true, number = 0;
// console.log(bar + 0);      1
// console.log(bar + "xyz");  "truexyz"
// console.log(bar + true);   2
// console.log(+true);        1
// console.log(!'bluej');     false
// console.log(number++);     0
// console.log(++number);     2
// console.log(number);       2

// 11. 根据用户输入时间实现倒计时，输入时间格式错误时要有错误提示（5）
let input = window.prompt('请输入目标时间');
let t = new Date(input).getTime();
if (t < 0) {
  alert('输入错误');
}
function getTime() {
  let date = new Date(Date.now());
  let remainTime = (t - date.getTime()) / 1000;
  let day = Math.floor(remainTime / (60 * 60 * 24))
    .toString()
    .padStart(2, '0');
  let hour = Math.floor((remainTime / (60 * 60)) % 24)
    .toString()
    .padStart(2, '0');
  let minute = Math.floor((remainTime / 60) % 60)
    .toString()
    .padStart(2, '0');
  let second = Math.floor(remainTime % 60)
    .toString()
    .padStart(2, '0');
  console.log(
    '倒计时还剩：' + day + '天' + hour + '小时' + minute + '分' + second + '秒'
  );
}
let timer = setInterval(function () {
  getTime();
}, 1000);

// 12.输出从小到大排序好的五个不重复的随机"素数",范围[10-58)；（10）
// 质数也叫素数是指在大于1的自然数中，除了1和它本身以外不再有其他因数的自然数，不能被任何整数整除的数。
let arr12 = [];
function sqrt(num) {
  let sqrt = Math.sqrt(num);
  for (let i = 2; i <= sqrt; i++) {
    if (num % i === 0) {
      return false;
    }
  }
  return num > 1;
}
function getNum(count) {
  while (arr12.length < count) {
    let num = Math.floor(Math.random() * (58 - 10) + 10);
    if (!arr12.includes(num) && sqrt(num)) {
      arr12.push(num);
    }
  }

  return arr12;
}
console.log(arr12, getNum(5));
// 13.把下面数组成员排序打乱；（5）
let arr13 = [10, 20, 30, 40, 50, 60];
let newArr2 = []; // 打乱之后的数组
function fn13(arr) {
  let numarr = [];
  for (let i = 0; i < arr.length; i++) {
    let num = Math.floor(Math.random() * arr.length);
    if (!numarr.includes(num)) {
      numarr.push(num);
    } else {
      i--;
    }
    numarr.map(function (value, index) {
      newArr2[i] = arr[value];
    });
  }
  return newArr2;
}
fn13(arr13);
console.log('arr13', newArr2);
// 14. 将多个数组进行去重合并；（10）
let arr140 = [1, 2, 3],
  arr141 = [2, 3, 4, 5];
function fn14(arr1, arr2) {
  let newarr14 = arr1.concat(arr2).filter(function (value, index, self) {
    return self.indexOf(value) === index;
  });
  return newarr14;
}
console.log('arr14', fn14(arr140, arr141));
// 15. 找出数组 arr=[1, 2, 3, "a", 4, "a", 2, 4, "a"] 中重复出现过的元素,并用数组将重复元素装起来输出,并且统计每个元素出现的次数（10）

let arr15 = [1, 2, 3, 'a', 4, 'a', 2, 4, 'a'];
let arr15Res = [];
let obj = {};
function fn15(arr) {
  arr.filter(function (item, index, self) {
    if (self.indexOf(item) !== index && !arr15Res.includes(item)) {
      arr15Res.push(item);
    }
  });
  return arr15Res;
}
for (let i = 0; i < arr15.length; i++) {
  if (arr15[i] in obj) {
    obj[arr15[i]]++;
  } else {
    obj[arr15[i]] = 1;
  }
}
arr15Res = fn15(arr15);
console.log('arr15', arr15Res);
console.log('obj', obj);
// 16. 找出数组中年龄小于18岁的女生的信息重新组成新的数组,并且将她们count变为现有的平方（10）
let arr16 = [
  {
    name: '111',
    sex: 'boy',
    age: 18,
    count: 20,
  },
  {
    name: '222',
    sex: 'girl',
    age: 17,
    count: 30,
  },
  {
    name: '333',
    sex: 'boy',
    age: 16,
    count: 40,
  },
  {
    name: '444',
    sex: 'girl',
    age: 15,
    count: 50,
  },
  {
    name: '555',
    sex: 'boy',
    age: 20,
    count: 60,
  },
  {
    name: '666',
    sex: 'girl',
    age: 13,
    count: 70,
  },
  {
    name: '777',
    sex: 'boy',
    age: 14,
    count: 80,
  },
];
let newarr16 = [];
let arr16Res = [];
function fn16(arr) {
  arr.filter(function (value, index, self) {
    if (self[index].age < 18 && self[index].sex == 'girl') {
      newarr16.push(value);
    }
    return newarr16;
  });
}
fn16(arr16);
console.log('a', newarr16);
arr16Res = newarr16.map(function (value, index, self) {
  self[index].count = Math.pow(self[index].count, 2);
  return value;
}, []);
console.log('arr16', arr16Res);

// 17. 实现一个深克隆函数 (加分题 5)
let obj17 = {
  a: 1,
  b: 2,
  c: undefined,
  d: {
    id: 1,
    name: '洗碗柜',
  },
  e: NaN,
  f: function () {},
  g: [1, 2, 3],
};
function fn17(value) {
  let res = Array.isArray(value) ? [] : {};
  for (const key in value) {
    if (value[key] instanceof Object) {
      res[key] = fn17(value[key]);
    }
    if (Object.prototype.toString.call(value[key]) == Function) {
      res[key] = Function;
    } else {
      res[key] = value[key];
    }
  }
  return res;
}
let o = null;
o = fn17(obj17);
o.a = 999;
o['g'][0] = 123;
console.log('o', o);
console.log('obj17', obj17);
// 18. 实现一个数组的reduce方法 (加分题 5)

// 19. 写出强制转换的方法有哪些 (加分题 5)

// 20. 如何判断一个对象是否为空对象的3种方法 (加分题 5)
